Volta を使って、ローカル開発環境(M1 Mac)と GitHub Actions ランナーの Node および npm バージョンを揃えてみた

Volta を使って、ローカル開発環境(M1 Mac)と GitHub Actions ランナーの Node および npm バージョンを揃えてみた

Clock Icon2024.08.13

こんにちは、製造ビジネステクノロジー部の若槻です。

Volta は Rust 製の JavaScript ツールマネージャーで、Node ランタイムやパッケージマネージャーのバージョンをプロジェクトごとに簡単に管理可能となります。

https://volta.sh/

今回は、Volta を使って、ローカル開発環境(M1 Mac)と GitHub Actions ランナーの Node および npm のバージョンを揃える方法を紹介します。

やってみた

ローカル開発環境の仕様確認

$ sw_vers
ProductName:            macOS
ProductVersion:         14.5
BuildVersion:           23F79

$ sysctl -n machdep.cpu.brand_string
Apple M1

$ node --version
v20.9.0

$ npm --version
10.2.4

ローカル開発環境(M1 Mac)に Volta を導入する

Volta のインストール

curl https://get.volta.sh | bash

PATH の設定

export PATH="$HOME/.volta/bin:$PATH"
source ~/.zshrc # or ~/.bashrc

必要に応じて、シェルの設定ファイルを変更してください。

echo 'export PATH="$HOME/.volta/bin:$PATH"' >> ~/.zshrc # or ~/.bashrc

package.json に Volta の設定を追加する

package.json が作成されている開発プロジェクトに移動します。

volta pin コマンドを固定したいバージョンを指定して実行します。

volta pin node@20.16.0
volta pin npm@10.1.0

package.json に次のような設定が追加されます。

package.json
{
  "volta": {
    "node": "20.16.0",
    "npm": "10.1.0"
  }
}

今回は Node および npm のバージョンを固定しましたが、いずれか一方を固定することも可能です。

Volta の設定に ローカル開発環境の Node および npm バージョンを揃える

Volta を導入している他の開発者が Node を使用する際に、package.json に記載された Node および npm バージョンが使用されるようになります。

$ node --version
v20.9.0

$ npm --version
10.1.0

この時、Volta で初めて使用するバージョンの場合、バイナリがダウンロードされます。

これで、開発メンバーのローカル開発環境間で Node および npm バージョンを揃えることが可能となります。

Volta の設定に GitHub Actions ランナーの Node および npm バージョンを揃える

Volta 公式が公開しているアクションを使用することで、GitHub Actions ワークフローで Volta の設定をもとに Node ランタイムやパッケージマネージャーのバージョンを揃えることができます。
https://github.com/volta-cli/action

GitHub Actions ワークフローのサンプル

.github/workflows/manual-test.yml
name: Manual Test

on: workflow_dispatch

jobs:
  create_json:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Volta Action
        uses: volta-cli/action@v4

      - name: Version Check
        run: |
          node --version
          npm --version

動作確認

ワークフローを実行すると、Node ランタイムおよび npm のバージョンが package.json に記載されたバージョン(v20.9.0 および 10.1.0)に揃えられていることを確認できました。

setup-node アクションを使うと、Node バージョンのみが Volta の設定に従って揃えられる

GitHub 公式の setup-node アクションを使用した場合は、Volta の設定が反映されるのは Node バージョンのみ となるので注意が必要です。
https://github.com/actions/setup-node/blob/main/docs/advanced-usage.md#node-version-file

次のように node-version-file プロパティで package.json を指定して使用します。

.github/workflows/manual-test.yml
name: Manual Test 2

on: workflow_dispatch

jobs:
  create_json:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          # Volta の設定が反映されるのは Node バージョンのみ
          node-version-file: package.json

      - name: Version Check
        run: |
          node --version
          npm --version

ワークフローを実行すると、Node ランタイムのみが package.json に記載されたバージョン(v20.9.0)に揃えられています。npm は 10.1.0 ではなく 10.8.0 が使用されています。

Volta を使用している環境で setup-node アクションを使いたい場合は留意しましょう。

おわりに

Volta を使って、ローカル開発環境(M1 Mac)と GitHub Actions ランナーの Node および npm バージョンを揃えてみました。

Node および npm の両者のバージョンを単一のツールでとても簡単に統一することが出来ました。導入も簡単なので、ぜひ試してみてください。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.